interface InA {
  name?: string;
  age?: number;
  sex: boolean;
}

/*in : 真正的遍历*/
type MyReadOnly<T> = {
  readonly [K in keyof T]: T[K]
}

type NewA = MyReadOnly<InA>;

/**
 interface Type{
  readonly name:string;
  readonly age:number;
}
 **/
// let a: NewA = {
//   name: 'xiaowang',
//   age: 123
// }
// a.name = 'xiaozhang' // error

// pick : 摘
type MyPick<T extends object, K extends keyof T> = {
  // K : 'name' | 'age'
  // P : name:   T[P]:string
  // P : age : T[P]: number
  [P in K]: T[P]
}

type U = MyPick<InA, 'name' | 'age'>
let bb: U = {
  name: '小张',
  age: 26,
}

/*
* 全部都变成选填
* -? 必须填
* */

type MyPartial<T> = {
  // keyof T name |age |sex
  // K --> name
  [K in keyof T]? : T[K]
};

let c: Partial<InA> = {
  name:'123', // 不报错
  // ggg:'123' //报错
  sex:true,
  age:12
}

/*
* type : 类型别名
* keyof : 类型索引 作用 把类型的子集变成联合类型  {name:string,age:number}  name|age
* extends : 取子集
* in : 遍历
* extends 和 keyof 结合的比较多 K extends keyof T  K只能是name/age
* P in keyof K : 遍历所有的子集 第一次 P : name 第二次 age
* */


/*
  条件类型  三目运算
* 装饰器    @
* 枚举类型  enmu
*
* */
